package top.wuchu.rpc.transport.netty.client;

import top.wuchu.rpc.entity.RpcResponse;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 这个类存储没有处理完成的请求
 * @author Wuchu
 */
public class UnprocessedRequests {

    private static ConcurrentHashMap<String, CompletableFuture<RpcResponse>> unprocessedResponseFutures = new ConcurrentHashMap<>();

    /**
     * 将处理requestId这个请求的completeFuture存在unprocessedResponseFutures中
     * @param requestId
     * @param future
     */
    public void put(String requestId, CompletableFuture<RpcResponse> future) {
        unprocessedResponseFutures.put(requestId, future);
    }

    public void remove(String requestId) {
        unprocessedResponseFutures.remove(requestId);
    }

    /**
     * 一旦调用了 complete() 方法，CompletableFuture 对象的状态会立即变为已完成，而且之后任何对该对象的计算都不会再触发异步任务的执行。
     * 如果该对象已经处于完成状态，再次调用 complete() 方法不会有任何效果
     * @param rpcResponse
     */
    public void complete(RpcResponse rpcResponse) {

        CompletableFuture<RpcResponse> future = unprocessedResponseFutures.remove(rpcResponse.getRequestId());
        if (null != future) {

            future.complete(rpcResponse); // complete用来告知CompletableFuture任务完成

        } else {
            throw new IllegalStateException();
        }
    }

}
